<?php

namespace linghuo;

use think\exception\HttpException;

class Linghuo
{

    // 深圳前海友邦健康科技有限公司
    //
    // protected $puk = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxIidk18omKtKTMOD5dTdX353yxvwk4J+VwVlQ5/rAJwnFBeXmy3kJG3hJj/K3lChr5wLrIpUJQB/dyQqOxMvklw13Uldwe9nd+ffCZfJ0V7guXVfymnyicd9Dz9leuXLV7H+xmjyrz8pFWdtE1KjN5yMAkFhv8EXPsHNgqMA1yCTysz+z8RCu27BYQC3OFgLLKxGH46gbu6m8kUEbvPJlZ5WtwUGcgv62KOVmg40dVpKhNXPjGaljj2ZVFYJiszBLcVVJ6UzJkCykjdB7BUPxXWuaprStELnGvnKY68fEWME8gRWmMBydUJZ8YNlTf+6gVyHXWw/eGKIC+vUCqKTMwIDAQAB';

    // protected $prik = 'MIIEpQIBAAKCAQEAt3MfBiE0Ha1k0/YApl5Ynd29Zv2k8yvIooxKF9hhsLJgsVUlSMIuf3T/e9RH+CDslnfQBlmMH7buRXukQhir2Uhm6ii2n40s5VEXbYWzk0CTz77zpXxTTJJZf1diaRBPmzrKvYlSNYwTSH9vCBxzdX3d0kKvyNl4LN5VrNd2+sdQ+xisgAY3yMEDfX0aj6K/7PE5mSdUJ9KAD7Vhx2KKyDmFCP8IQX3RqF+7mUN+uJkuZ9n7dnMPV5zjlJ5wPNIfy0DIVYPFPkXoqpP5O+9wU2uCQs7srz+hMB2M0rzlRjupBiaaIuEmOICqfS2/8CXpky/yidl0ZmpiNPRa1v2P1wIDAQABAoIBAQCDJaXUOACOBtvCPGgSh/hKQ6+X5VT7Ex4INsrxaRvNungtznUtIsUjEX1kBUq+NKtulpD9OR9XvOtyeQXgyspwN7Z7SEfmoIKsHeDlx2Otrcj+B8EfWVYjs6yPwOT1v1dp3gn6niVLaqyOc6vo3I4ePLFME6ifqfij+v685fyFIqsCP5xhDJc2fFDWkW+5iRiS5Yef27IrGezSijPDhW0epgfJ5FRtZP1NjVGHAlxFBJFwoLYtzjFhvGLOYbEOOZjR75li50ZTYnsnYgu7gAbbE/+wRY3EPWXxk8gLVN4Sl6zJy/KVTIergu5P5VIP9Uoo87WxyqfebpaLoJVKQ93BAoGBANn0A3DgzMoQCJFePaGtsXE0uJh4IH81pqDp698ZcWDzD0+h+6i58V+hS75ienwcnH5/CD2Lb2EznnKPHfvKVqP4AME8rUIYjAjju4QS8fWHC33I75blYJSdLVNTHabjmL13+BDTbogWX7u+/xQrLC7JZRhYvVPSCT1JeKKx9AufAoGBANd5M3IKOe4LJGscxAncA9+lrP/Hrs5wf7ZAnB/so/x1hwSZJnuxSTOSLXTaLoN/ddf8pyELGNdiJJPNHEUQT/Oe7KaLjoiYyzbGiHKNATnebzbUuKOFUDrOHXrJk/VSzZYn3ptQG7Z1eTMBeqdej8KI72zFr3jDSn76AB5IyZDJAoGBANlRZwTsAQYRCpn3v7gv+leIW+8bCDwPAMA9vgRL2DL05/Vc7BMGpFfX+jAw/TQ3SwsOGudS2pGu6HQNo7XlwJHpvMbwe0kGNMrAV76PLVbFen3HFq38tFo6hnEo1M4M7cUtk9kjGHj05ivLe4derMVR5k1qXgzvxmqnkXOXwGC9AoGBAITMTvee89sRBO36+Zt1/PEug7PUlpjm3t8tbMuEJgEnUgJ0fTJIrmvZUKiu+3HR8YgfT8Xet/2uoApzpFOwXQYx0XpHkp3/RWdJ7rhizPmkbHinm/Az7qF/fM27RLQyx0Ae7GRed+X4+qyD4dsbPZDQoncwUxgjjFs7qyz/ATN5AoGASVQStnFu260VhksdsQxjadMvWh0yIlKqcWPSxMj1tVuXDJT7x+18sxsOGp6ta4VoBxm89U4BVJHRJ8uewT2hr2XBfXAGiwNSXNU44dcT8eswjQ2gvIa28B0lCuZzVTdA1WIIIwDzGxxIBjLyNEiRDgqxMCExa4xbIZVhilAjiYA=';

    // protected $host = 'https://fec.51wanquan.com';
    // protected $merchantNo = 'A10079-B10208-M10542';//商户号
    // protected $providerNo = 'S10093';//服务商号
    // protected $productCode = 'P1614171017';//产品编号
    // protected $taskCode = 'S152926237464';//项目编号 任务编号
    // protected $usePayPass = self::PAY_PASS_4;

    //
    // 中军昆仑摩派（广东）智能科技有限公司
    protected $puk = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxIidk18omKtKTMOD5dTdX353yxvwk4J+VwVlQ5/rAJwnFBeXmy3kJG3hJj/K3lChr5wLrIpUJQB/dyQqOxMvklw13Uldwe9nd+ffCZfJ0V7guXVfymnyicd9Dz9leuXLV7H+xmjyrz8pFWdtE1KjN5yMAkFhv8EXPsHNgqMA1yCTysz+z8RCu27BYQC3OFgLLKxGH46gbu6m8kUEbvPJlZ5WtwUGcgv62KOVmg40dVpKhNXPjGaljj2ZVFYJiszBLcVVJ6UzJkCykjdB7BUPxXWuaprStELnGvnKY68fEWME8gRWmMBydUJZ8YNlTf+6gVyHXWw/eGKIC+vUCqKTMwIDAQAB';

    protected $prik = 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC1uXabuUU5rwnvqtNOlFemx45m4keQBazn8daEOprkIm4faisG/PmkQAuKZleLq1vHx6WFNz72v+8dKSQIkKC67oCg5sEIwA1zmeTqYG747o9hmf4pbOWfPSlywmo5zd7LTj/teHz5o235rKsuPFP07k8pZamGKG9sivgLTrLa4ShzPFWSGnL2tVvpg4ZeclxxyMHvkZM5T3yxZhdiEePyN5KInbDNA/L6OqRxpk6u8gTWiVoORHJIAm9Pvvbqx46YebvfdnAG2A/ZvLA/Ni5dI47Q/ZFBU8PHEOD1f7fYEwkNvc3fln/WNNP3MLIh5/rgehgBCWZK2Q+CgeE1zwcrAgMBAAECggEAZhRuaf9iwYpv3G9rD4MI0ajbdzO421A01n3k8JYzF9+3WHI9BUnpubg4Q2BF4TE69zhQ5EoqVlVurkTD9wO3Jgp/uuKkoJOxerSCAJ529+KaLEtimEaRnievNsW7AgmBE1c7VdwO5/RD/LJf3jMJPlb3pNt0pOXl4WUW/NMSaRyLBfd91CuleZk7rv+RiDgUk3wMa7ca/N0ZgiewZuDUikaDNdwjDnIwJOA6H5nAExqsMe+3ZeZJj4WvsqWmY7bZDZUHX09gUwvO3KAA8b7BIexM/bTNqgGjd5M78vcooTrXM2SgNSJOWtYnaLqUQeM9c+xzdT2R0yXz4zxPcnqLEQKBgQDjGNIvazhqA7bt9ljeur4wHBF+8rCKuOoZhW8ek5BuENmKpomr0rGimcS3DDViuG3B4HsXFwLLsKaDuYL8Dm434D45Y3lDhyi84cub3TIg4pLRsXoNASUyrUTPyV6pqdV6ZGpGvFo01GA8htbgl+VsRNbZvT9KRA9afiCvWqY6LwKBgQDM2lWmgkZBtkSHkPurt0ZTAFwRtttXDYDk8z2Xcs2ms+jR4HEOUdy4RjNCsZZAnQ6JjXvjGjV1GEoGwqHjg5hSVfIgMiXCWhPO6VGTGSCc8kmJ4wtUhw+HQnHSrvculT61aCRQV79kGkpnBRSXv8fmFGKsf/KBDCTZ7xXkt9yPxQKBgFKogCh+UERWIckvd11qfzsnnD6muxdjAuJTLQTmFRXa0DOlNkryH3Hdojo2GWBbXKfKu0LGP2BAZftgFIsF/Zwc5MkiqcqocW1+igurUUmi7mmgvZnqJs3xPzCaTPhYNrmbvwsMF5FPE9A0DBYnc3wa+lC6j0TKzQPVELSCvCpFAoGBAIUWrGK7bI2wryEsTnWnYqb2KtrPY/1QppcYeMF2MqnFZNNF7+2Pvchyw0bnPWjJIPK42u4Wzvg+SYnO1YKMsl97uwyzx9hW0VuyNe9NeeS9fI161peaD7qernhkd+7pw430FPOlrpCIjCIWKOTWEjcms1zC23h/vUlhjWXFFiTJAoGAZbAanBUhzSKCPVPQIbJ790+NvZNK25ceqbm4vMmdTzmgcS9y2JP4+jlJke/8rL5k8+Q0lXBhdyGtYsy1ySpyoKPIb9U7xd2M2bHzIVko07GeN0lLKG1h5AQcfoIzVa8IDxH4pXAVWK11oGoyxnCFWexaLfxJhdFEE5DK/EHfmlo=';

    protected $host = 'https://fec.51wanquan.com';
    protected $merchantNo = 'A10079-B10208-M10914';//商户号
    protected $providerNo = 'S10086';//服务商号
    protected $productCode = 'P1413409427';//产品编号
    protected $taskCode = 'S122342114311';//项目编号 任务编号
    protected $usePayPass = self::PAY_PASS_2;

    public function __construct() {
        $config = config('thirdpay.linghuo');
        $this->puk = $config['puk'];
        $this->prik = $config['prik'];
        $this->host = $config['host'];
        $this->merchantNo = $config['merchantNo'];//商户号
        $this->providerNo = $config['providerNo'];//服务商号
        $this->productCode = $config['productCode'];//产品编号
        $this->taskCode = $config['taskCode'];//项目编号 任务编号
        $this->usePayPass = $config['usePayPass'];

    }
    /**
     * [register 注册]
     * @since  2022-09-24
     * @param  [type]     $name           [description]
     * @param  [type]     $idCard         [description]
     * @param  [type]     $phone          [description]
     * @param  [type]     $imgIdCardFront [description]
     * @param  [type]     $imgIdCardBack  [description]
     * @return [type]                     [description]
     */
    const BUSTYPE_1 = '1';
    public function register($name,$idCard,$phone,$imgIdCardFront,$imgIdCardBack)
    {
        $api = $this->host.'/api/fec/acct/register';
        $json = [
            'providerNo'=>$this->providerNo  ,// 服务商号
            'name'=>$name  ,// 姓名
            'idCard'=>$idCard  ,// 身份证号
            'phone'=>$phone,//  手机号
            'imgIdCardFront'=>$this->fileBase64($imgIdCardFront), //身份证正面 base64格式 Base64编码后的大小不超2M
            'imgIdCardBack'=>$this->fileBase64($imgIdCardBack),  //身份证反面 base64格式 Base64编码后的大小不超2M
            'busType'=>self::BUSTYPE_1, //业务类型 1委托代征2.个体户注册(分包)3.自然人代开4.临时税务登记
        ];

        // echo '请求URL:'.$api."\n";
        // echo '请求参数:'.json_encode($param)."\n";
        // echo '响应内容:'.$res[0]."\n";exit;
        // var_dump($api,json_encode($json));exit;
        return $this->exec($api,$json);
    }
    const CHANGE_TYPE_1 = '1'; //1:变更注册手机号
    const CHANGE_TYPE_2 = '2'; //2:变更影像件
    const CHANGE_TYPE_4 = '4'; //4：变更结算卡信息
    protected function fileBase64($filename,$imgtype = '')
    {
        return $imgtype.base64_encode( @file_get_contents($filename));
        // return 'data:image/webp;base64,'.base64_encode( file_get_contents($filename));
    }
    public function update($memberId,$changeType,$phone,$imgIdCardFront='',$imgIdCardBack='',$bankNo='',$cardNo='',$bankPhone='')
    {
        $api = $this->host.'/api/fec/acct/update';
        $json = [

            'memberId'=>$memberId,    // 是   string(36)  会员ID
            'changeType'=>$changeType,  // 是   string(1)   变更类型 1:变更注册手机号 2:变更影像件 3:拓展业务类型 4：变更结算卡信息
            'merchantNo'=>$this->merchantNo,  // 是   string(50)  商户编号
            'providerNo'=> $this->providerNo, // 是   string(50)  服务商号 变更类型为3必传
            'phone'=> $phone,  // 是   string(11)  注册手机号
            // imgIdCardFront //  否   string  身份证正面 base64格式
            // imgIdCardBack   // 否   string  身份证反面 base64格式
            'payPass'=>$this->usePayPass, // 是   string(1)   支付通道（1:众邦, 2: 支付宝, 4: 招商银行） 变更类型为4必传
            // bankNo  // 否   string(30)  开户行编号 变更类型为4必传
            // cardNo  // 否   string(30)  结算卡号 变更类型为4必传
            // bankPhone   // 否   string(11)  银行预留手机号 变更类型为4必传
            // busType // 否   string(1)   业务类型 委托代征2.个体户注册(分包)3.自然人代开4.临时税务登记 变更类型为3必传
            // imgBank // 否   string  银行卡照片 变更类型为4必传(暂时不传, 后期上线后会有变动)
        ];
        if ($changeType == self::CHANGE_TYPE_1) {

        }elseif ($changeType == self::CHANGE_TYPE_2) {
            $json['imgIdCardFront'] = $this->fileBase64($imgIdCardFront);
            $json['imgIdCardBack'] = $this->fileBase64($imgIdCardBack);
        }elseif ($changeType == self::CHANGE_TYPE_4) {
            $json['bankNo'] = $bankNo;
            $json['cardNo'] = $cardNo;
            $json['bankPhone'] = $bankPhone;
        }
        return $this->exec($api,$json);

    }
    const COST_UNDERTAKER_1 = '1';//手续费承担方 1:企业承担
    const COST_UNDERTAKER_2 = '2';//手续费承担方 2:客户承担
    /**
     * [pay 支付]
     * @since  2022-09-25
     * @param  [type]     $memberId       [description]
     * @param  [type]     $changeType     [description]
     * @param  [type]     $phone          [description]
     * @param  string     $imgIdCardFront [description]
     * @param  string     $imgIdCardBack  [description]
     * @param  string     $bankNo         [description]
     * @param  string     $cardNo         [description]
     * @param  string     $bankPhone      [description]
     * @return [type]                     [description]
     */
    public function pay($payList)
    {
        $api = $this->host.'/api/fec/order/pay';
        $json = [
            'providerNo'=> $this->providerNo, // 是   string(50)  服务商号
            'taskCode'=> $this->taskCode, //     是   string(50)  任务编号
            'productCode'=> $this->productCode, //  是   string(50)  产品编号
            'costUndertaker'=> self::COST_UNDERTAKER_1, //   是   string(1)   手续费承担方 1:企业承担 2:客户承担
            'payPass'=> $this->usePayPass, //  是   string(1)   支付通道（1:众邦 2:支付宝, 4: 招商银行）
            'batchNumber'=> date('Ymd-'). sprintf('%05d', rand(0,99999) ) , //  是   string(14)  批次号 格式：20200101-00001 当天日期+五位序列号
        ];
        $json['payList'] = $payList;
        $log = '原始参数：'.json_encode($json,JSON_UNESCAPED_UNICODE).PHP_EOL;
        // memberId    是   string(36)  会员ID
        // name    是   string(50)  会员名称
        // idCard  是   string(50)  身份证号
        // fee 是   string(20)  金额 单位元，精确到两位小数点 示例： 10.05元
        // aliPayNo    否   string(50)  支付宝号 支付通道2 必传
        $payres = $this->exec($api,$json);
        $log .= '响应内容：'.json_encode($payres,JSON_UNESCAPED_UNICODE).PHP_EOL;
        \think\Log::record($log,'thirdpay');
        return $payres;
    }
    /**
     * [info 商户是否有钱]
     * @since  2022-09-30
     * @return [type]     [description]
     */
    public function info()
    {
        $api = $this->host.'/api/fec/acct/info';
        $json = [
            'providerNo'=> $this->providerNo, // 是   string(50)  服务商号
            'payPass'=> $this->usePayPass, //  是   string(1)   支付通道（1:众邦 2:支付宝, 4: 招商银行）格式：20200101-00001 当天日期+五位序列号
        ];
        // memberId    是   string(36)  会员ID
        // name    是   string(50)  会员名称
        // idCard  是   string(50)  身份证号
        // fee 是   string(20)  金额 单位元，精确到两位小数点 示例： 10.05元
        // aliPayNo    否   string(50)  支付宝号 支付通道2 必传
        return $this->exec($api,$json);
    }
    const PAY_PASS_4 = '4';//招商银行
    const PAY_PASS_2 = '2';//支付宝
    /**
     * [bank 用户账户开户接口]
     * @since  2022-09-24
     * @return [type]     [description]
     */
    public function bank($memberId,$bankNo,$cardNo,$bankPhone,$imgFace)
    {
        $api = $this->host.'/api/fec/acct/open';
        $json = [
            'memberId'=>$memberId,//    否   String(36)  会员ID
            'payPass'=>$this->usePayPass,// 是   string(1)   支付通道（2: 支付宝, 4: 招商银行）
            'bankNo'=>$bankNo,//  是   string(30)  开户行编号 （众邦必传）
            'cardNo'=>$cardNo,//  是   string(30)  卡号 （众邦必传）
            'bankPhone'=>$bankPhone,//   是   string(11)  银行预留手机号（众邦必传）
            'imgFace'=>$this->fileBase64($imgFace),// 是   string  面部高清照，格式要求：Base64值；Base64编码后的大小不超2M
            // videoBase64 否   string  (暂未上线)用于活体检测的视频，视频的Base64值；Base64编码后的大小不超5M，支持mp4、avi、flv格式。请使用标准的Base64编码方式(带=补位)，编码规范参考RFC4648
            // 'validDateStart'=>'',//  否   string(30)  证件有效期开始日期 （众邦必传） 格式：yyyyMMdd 20000101
            // 'validDateEnd'=>'',//    否   string(30)  证件有效期截止日期 （众邦必传） 格式：yyyyMMdd 20180101 长期上送”长期”中文字符
            // 'address'=>'',// 否   string(30)  住址 （众邦必传）
            // 'ipAdr'=>'',//   否   string(30)  IP 地址 （众邦必传）
        ];
        return $this->exec($api,$json);
    }
    const QUERY_TYPE_1 = '1';
    const QUERY_TYPE_2 = '2';
    const QUERY_TYPE_3 = '3';
    /**
     * [query 用户信息查询接口]
     * @since  2022-09-24
     * @param  [type]     $type     [查询类型 1:查询基本信息 2:查询开户信息 3:查询会员ID]
     * @param  [type]     $memberId [会员ID （查询类型 1/2必传）]
     * @param  [type]     $payPass  [支付通道 1:众邦 （查询类型 2 必传）, 2: 支付宝, 4: 招商银行]
     * @param  [type]     $idCard   [身份证号 （查询类型 3 必传）]
     * @return [type]               [description]
     */
    public function query($type,$memberId='',$idCard='')
    {
        $api = $this->host.'/api/fec/acct/query';
        $json = [
            'type'=>$type,// 是   查询类型 1:查询基本信息 2:查询开户信息 3:查询会员ID
            // 'memberId'=>$memberId,//  否(36)   string  会员ID （查询类型 1/2必传）
            // 'payPass'=>$this->usePayPass,//  否(1)    string  支付通道 1:众邦 （查询类型 2 必传）, 2: 支付宝, 4: 招商银行
            // 'idCard'=>$idCard,//   否(36)   string  身份证号 （查询类型 3 必传）
        ];
        if ($type == '1') {
            $json['memberId'] = $memberId;
        }elseif ($type == '2') {
            $json['memberId'] = $memberId;
            $json['payPass'] = $this->usePayPass;
        }elseif ($type == '3') {
            $json['idCard'] = $idCard;
        }
        
        // var_dump($json);exit;
        return $this->exec($api,$json);
    }
    // 支付状态
    const detail_payStatus_0 = '0';//待支付
    const detail_payStatus_1 = '1';//1:支付中
    const detail_payStatus_2 = '2';//2:支付成功
    const detail_payStatus_3 = '3';//3:支付失败
    const detail_payStatus_4 = '4';//4:已撤回
    /**
     * [detail 子订单详情查询接口]
     * @since  2022-09-24
     * @param  [type]     $orderNo     [交易流水号(50)]
     * @return [type]               [description]
     */
    public function detail($orderNo)
    {
        $api = $this->host.'/api/fec/order/query/detail';
        $json = [
            'orderNo'=>$orderNo,// 是   交易流水号(50)
        ];
        return $this->exec($api,$json);
    }

    protected function exec($api,$json)
    {
        $res = ['code'=>0,'msg'=>''];
        try {
            $param = $this->sign($json);
        } catch (HttpException $e) {
            $res['msg'] = $e->getMessage();
            return $res;
        }
        $log = '原始参数：'.json_encode($json,JSON_UNESCAPED_UNICODE).PHP_EOL;

        $httpRes = $this->curl_post($api,$param);
        $log .= '响应内容：'.json_encode($httpRes,JSON_UNESCAPED_UNICODE).PHP_EOL;
        if (empty($httpRes[0])) {
            $res['msg'] = '请求灵活用工失败';
            \think\Log::record($log,'thirdpay');
            return $res;
        }
        $arr = json_decode($httpRes[0],true);
        $res['data'] = $arr;
        if ($arr['code'] != 200) {
            $res['msg'] = $arr['message'];
            \think\Log::record($log,'thirdpay');
            return $res;
        }
        if ($arr['result']['statusCode'] != '1000') {
            $res['msg'] = $arr['result']['msg'];
            \think\Log::record($log,'thirdpay');
            return $res;
        }
        return ['code'=>1,'msg'=>'','data'=>$arr];
    }
    protected function curl_post($url,$uriParam)
    {
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
        // curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 使用命令不执行
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS,json_encode($uriParam)); // Post提交的数据包
        // curl_setopt($curl, CURLOPT_POSTFIELDS,http_build_query($uriParam)); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        curl_setopt($curl, CURLOPT_HTTPHEADER,['Content-type:application/json']); // 设置头部
        // curl_setopt($curl, CURLOPT_HTTPHEADER,['Content-type:application/x-www-form-urlencoded']); // 设置头部
        $res = curl_exec($curl); // 执行操作
        $errno = curl_errno($curl);
        curl_close($curl); // 关闭CURL会话
        return [$res,$errno];
    }
    protected function sign($json)
    {

        // 加密规则
        // AES使用的算法和填充模式为AES/ECB/PKCS5Padding, RSA使用SHA1WithRSA, AES秘钥长度24字节.
        // requestData：首先将具体业务的接口请求参数按照对应的要求组装成完整的json数据格式字符串，将json字符串进行AES加密后得到A密文。再将A密文进行base64编码，把编码后的数据赋值到requestData.
        // 即: requestData = base64(aes(to_json_string(origin_data), aes_key)))
        $json = is_string($json)?$json:json_encode($json);

        $aes_key = \fast\Random::alnum(24);
        // $cipher='AES-128-ECB';
        $cipher='AES-192-ECB';
        $requestData = openssl_encrypt($json, $cipher, $aes_key);
        // var_dump($requestData);exit;
        // encryptKey： 使用系统公钥(SYSTEM_PUBLIC_KEY, 由我方提供)对AES密钥进行RSA加密，再将密文进行base64编码，编码后的密文赋值给encryptKey。AES密钥可以在每次加密过程中都重新生成不一样的值，使敏感数据在传输过程中更加安全。
        // 即: encryptKey = base64(rsa.encrypt(aes_key, system_public_key))
        $res = "-----BEGIN PUBLIC KEY-----\n" . wordwrap(trim($this->puk), 64, "\n", true) . "\n-----END PUBLIC KEY-----";
        // var_dump($res);exit;
        if (!openssl_pkey_get_public($res)) {
            throw new HttpException(400,'请检查服务商RSA公钥配置');
        }
        $res = openssl_public_encrypt($aes_key, $encryptKey, $res,OPENSSL_PKCS1_PADDING); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持
        if (!$res) {
            throw new HttpException(400,'服务商RSA公钥加密失败');
        }
        $encryptKey = base64_encode($encryptKey);


        list($microsecond , $time) = explode(' ', microtime());
        $microsecond =1;
        $microsecond = sprintf('%3d',$microsecond*1000);
        $param = [
            'requestTime'=>date('YmdHis'). ($microsecond === '1000'?999:$microsecond),//发起请求的时间，格式：yyyyMMddHHmmssSSS
            'nonce'=>\fast\Random::alnum(32),//随机字符串
            'merchantNo'=>$this->merchantNo,//商户号
            'requestData'=>$requestData,//商户号
            'encryptKey'=>$encryptKey,//商户号
        ];
        $str = implode('', $param);

        // sign：按照requestTime + nonce + merchantNo + requestData + encryptKey的顺序将此拼接起来然后RSA商户秘钥(对接方私钥, 并提供对接方的公钥给到我方)签名，签名后的密文后赋值给sign参数。这里的+号仅表示字符串连接, 不计入字符串里.

        // 即: sign = rsa.sign(format!(“{}{}{}{}{}”, requestTime, nonce, merchantNo, requestData, encryptKey), private_key)
        $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
            wordwrap($this->prik, 64, "\n", true) .
            "\n-----END RSA PRIVATE KEY-----";
        if (!openssl_pkey_get_private($res)) {
            throw new HttpException(400,'请检查RSA私钥配置');
        }
        // if ("RSA2" == $signType) {

        // $res = openssl_sign($str, $sign, $res, OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持

        // } else {
            $res = openssl_sign($str, $sign, $res);
        // }
        if (!$res) {
            throw new HttpException(400,'私钥签名失败');
        }
        $param['sign'] = base64_encode($sign);
        return $param;
    }
}
